#include "RingQueue.hpp"
#include "task.hpp"

RingQueue<func_t> rq(4);
Mutex mutex;
void* consumer(void* arg)
{
    func_t res;
    rq.Pop(&res);
    //访问显示器临界资源，需要用另一把锁进行保护
    LockGuard lg(mutex);
    res();
    lg.~LockGuard();
    return nullptr;
}

void* productor(void* arg)
{
    func_t* ptr = static_cast<func_t*>(arg);
    rq.Push(*ptr);
    return nullptr;
}

int main()
{
    std::vector<func_t> task = {Print,Log,Flush,Cal};
    std::vector<pthread_t> p(4);
    std::vector<pthread_t> c(4);

    for(int i = 0;i < 4;i++)
        pthread_create(&c[i],nullptr,consumer,nullptr);
    for(int i = 0;i < 4;i++)
        pthread_create(&p[i],nullptr,productor,&task[i]);
    
    for(int i = 0;i < 4;i++)
    {
        pthread_join(p[i],nullptr);
        pthread_join(c[i],nullptr);
    }
    return 0;
}